home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 May / PCpro_2006_05.ISO / files / mobile / fma-2.0-stable-setup.exe / {app} / source / uInfoView.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2004-06-23  |  19.3 KB  |  660 lines

  1. unit uInfoView;
  2.  
  3. {
  4. *******************************************************************************
  5. * Descriptions: Phone Info view implementation
  6. * $Source: /cvsroot/fma/fma/uInfoView.pas,v $
  7. * $Locker:  $
  8. *
  9. * Todo:
  10. *
  11. * Change Log:
  12. * $Log: uInfoView.pas,v $
  13. * Revision 1.19  2004/06/23 13:50:19  z_stoichev
  14. * Added Chat support
  15. * Added More hyperlinks
  16. * Check archive for new messages
  17. *
  18. * Revision 1.18  2004/06/21 09:46:13  z_stoichev
  19. * Added open/close buttons.
  20. * Custom splitter painting.
  21. *
  22. * Revision 1.17  2004/06/19 11:17:11  z_stoichev
  23. * - Fixed Fma Today panel constraints.
  24. * - Added Fma Today cotext popup menu.
  25. * - Changed Fma Today calls popup menu.
  26. * - Changed Fma Today page hides explorer.
  27. *
  28. * Revision 1.16  2004/06/18 13:50:19  z_stoichev
  29. * - Changed Fma Today hyperlinks buttons.
  30. * - Fixed Fma Today page background color.
  31. * - Added Fma Today page vertical splitters.
  32. *
  33. * Revision 1.15  2004/06/15 13:03:27  z_stoichev
  34. * Missed calls fixes.
  35. *
  36. * Revision 1.14  2004/06/11 12:28:18  z_stoichev
  37. * Fixed horizontal splitter on resize update.
  38. *
  39. * Revision 1.13  2004/05/21 12:02:16  z_stoichev
  40. * Split vertically Fma Today page
  41. * Activity Log has been removed.
  42. *
  43. * Revision 1.12  2004/05/21 10:09:03  z_stoichev
  44. * Changed logging handle routines.
  45. *
  46. * Revision 1.11  2004/05/19 18:34:16  z_stoichev
  47. * Build 0.1.0.35c
  48. *
  49. * Revision 1.10  2004/04/01 15:30:28  z_stoichev
  50. * New Calls data format support
  51. *
  52. * Revision 1.9  2004/03/28 22:12:06  z_stoichev
  53. * added some more link buttons
  54. *
  55. * Revision 1.8  2004/03/26 18:37:39  z_stoichev
  56. * Build 0.1.0.35 RC5
  57. *
  58. * Revision 1.7  2003/12/12 16:57:18  z_stoichev
  59. * Changed diagram: dont scroll with mouse, show legend when wide.
  60. *
  61. * Revision 1.6  2003/11/28 09:38:07  z_stoichev
  62. * Merged with branch-release-1-1 (Fma 0.10.28c)
  63. *
  64. * Revision 1.5.2.5  2003/11/11 18:11:45  z_stoichev
  65. * GUI changes. add methods to manipulate GUI.
  66. *
  67. * Revision 1.5.2.4  2003/11/10 14:03:09  z_stoichev
  68. * RC3
  69. *
  70. * Revision 1.5.2.3  2003/10/30 13:29:52  z_stoichev
  71. * Unicode support in Activity log.
  72. * GUI changes.
  73. *
  74. * Revision 1.5.2.2  2003/10/28 10:15:35  z_stoichev
  75. * Always show memo last line.
  76. *
  77. * Revision 1.5.2.1  2003/10/27 07:22:54  z_stoichev
  78. * Build 0.1.0 RC1 Initial Checkin.
  79. *
  80. * Revision 1.5  2003/10/24 12:35:38  z_stoichev
  81. * Added connection commands log.
  82. *
  83. * Revision 1.4  2003/10/16 15:29:04  z_stoichev
  84. * Diagram settigs changed alot.
  85. * Now diagram shows last 1 minute of statistics.
  86. * Charge is shown on battery's axe, because
  87. * they have similar values.
  88. *
  89. * Revision 1.3  2003/01/30 04:15:57  warren00
  90. * Updated with header comments
  91. *
  92. *
  93. *******************************************************************************
  94. }
  95.  
  96. interface
  97.  
  98. uses 
  99.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  100.   StdCtrls, ExtCtrls, TeEngine, Series, TeeProcs, Chart, ComCtrls,
  101.   TntStdCtrls, ImgList, jpeg, Buttons, LMDControl, LMDBaseControl,
  102.   LMDBaseGraphicControl, LMDGraphicControl, LMDBaseMeter,
  103.   LMDCustomProgressFill, LMDProgressFill, TntComCtrls, LMDFill, Menus;
  104.  
  105. type
  106.   TfrmInfoView = class(TFrame)
  107.     Panel1: TPanel;
  108.     Panel2: TPanel;
  109.     TodayCaptionPanel: TPanel;
  110.     wOperator: TLabel;
  111.     wSignal: TLabel;
  112.     Image2: TImage;
  113.     wDate: TTntLabel;
  114.     Label9: TLabel;
  115.     Image1: TImage;
  116.     LMDFill2: TLMDFill;
  117.     DiagramPanel: TPanel;
  118.     Chart1: TChart;
  119.     Series1: TLineSeries;
  120.     Series3: TLineSeries;
  121.     Series2: TLineSeries;
  122.     PopupMenu2: TPopupMenu;
  123.     CallContact1: TMenuItem;
  124.     MessageContact1: TMenuItem;
  125.     Splitter1: TSplitter;
  126.     InboxPanel: TPanel;
  127.     Label17: TLabel;
  128.     Label10: TLabel;
  129.     Bevel2: TBevel;
  130.     Image3: TImage;
  131.     Label11: TLabel;
  132.     wInboxNew: TLabel;
  133.     CallsPanel: TPanel;
  134.     Label15: TLabel;
  135.     Label21: TLabel;
  136.     Bevel4: TBevel;
  137.     Image5: TImage;
  138.     Label22: TLabel;
  139.     wRecentCallsNum: TTntLabel;
  140.     lvCalls: TTntListView;
  141.     BatteryPanel: TPanel;
  142.     Label26: TLabel;
  143.     Label27: TLabel;
  144.     Bevel6: TBevel;
  145.     Image7: TImage;
  146.     Label5: TLabel;
  147.     Label3: TLabel;
  148.     Label2: TLabel;
  149.     Label4: TLabel;
  150.     Label7: TLabel;
  151.     Label1: TLabel;
  152.     Label28: TLabel;
  153.     Label29: TLabel;
  154.     Label8: TLabel;
  155.     Label35: TLabel;
  156.     wCharge: TLabel;
  157.     lblTimeLeft: TLabel;
  158.     wBattery: TLabel;
  159.     lbPower: TLabel;
  160.     lbvbat: TLabel;
  161.     lbdcio: TLabel;
  162.     lbcyclescharge: TLabel;
  163.     lbicharge: TLabel;
  164.     lbiphone: TLabel;
  165.     lbtempbatt: TLabel;
  166.     Splitter2: TSplitter;
  167.     Splitter3: TSplitter;
  168.     linkGetMessages: TLabel;
  169.     linkJumpInbox: TLabel;
  170.     linkJumpArchive: TLabel;
  171.     OuboxPanel: TPanel;
  172.     Label18: TLabel;
  173.     Label19: TLabel;
  174.     Bevel3: TBevel;
  175.     Image4: TImage;
  176.     Label20: TLabel;
  177.     wOutboxNew: TLabel;
  178.     MissedCallsPanel: TPanel;
  179.     lvMissed: TTntListView;
  180.     Label24: TLabel;
  181.     Label25: TLabel;
  182.     Label23: TLabel;
  183.     Image6: TImage;
  184.     wMissedCallsNum: TLabel;
  185.     Bevel5: TBevel;
  186.     PhoneAddressPanel: TPanel;
  187.     BigImage: TImage;
  188.     Label30: TLabel;
  189.     Label31: TLabel;
  190.     Bevel7: TBevel;
  191.     Image8: TImage;
  192.     Label6: TLabel;
  193.     Label12: TLabel;
  194.     Label13: TLabel;
  195.     Label16: TLabel;
  196.     Label14: TLabel;
  197.     lbSerialNumber: TLabel;
  198.     lbSWRevision: TLabel;
  199.     lbModel: TLabel;
  200.     lbManufacturer: TLabel;
  201.     lbtempphone: TLabel;
  202.     Splitter4: TSplitter;
  203.     Splitter5: TSplitter;
  204.     linkComposeMessage: TLabel;
  205.     linkSendMessages: TLabel;
  206.     linkShowNewMessages: TLabel;
  207.     Label32: TLabel;
  208.     Label33: TLabel;
  209.     Image9: TImage;
  210.     Label34: TLabel;
  211.     Bevel1: TBevel;
  212.     linkSyncPhonebook: TLabel;
  213.     linkNewContact: TLabel;
  214.     linkShowPhonebook: TLabel;
  215.     wMENum: TLabel;
  216.     AddToPhonebook1: TMenuItem;
  217.     N1: TMenuItem;
  218.     N2: TMenuItem;
  219.     Refresh1: TMenuItem;
  220.     N3: TMenuItem;
  221.     Properties1: TMenuItem;
  222.     Image10: TImage;
  223.     Image11: TImage;
  224.     Image12: TImage;
  225.     Image13: TImage;
  226.     Image14: TImage;
  227.     Image15: TImage;
  228.     ImageList1: TImageList;
  229.     linkJumpOutbox: TLabel;
  230.     linkShowSIM: TLabel;
  231.     ChatContact1: TMenuItem;
  232.     procedure ListViewResize(Sender: TObject);
  233.     procedure ListViewCompare(Sender: TObject; Item1, Item2: TListItem;
  234.       Data: Integer; var Compare: Integer);
  235.     procedure spMissedClick(Sender: TObject);
  236.     procedure sbCheckInboxClick(Sender: TObject);
  237.     procedure FrameResize(Sender: TObject);
  238.     procedure linkGetMessagesClick(Sender: TObject);
  239.     procedure linkJumpMsgFolderClick(Sender: TObject);
  240.     procedure linkComposeMessageClick(Sender: TObject);
  241.     procedure linkSendMessagesClick(Sender: TObject);
  242.     procedure linkSyncPhonebookClick(Sender: TObject);
  243.     procedure linkShowPhonebookClick(Sender: TObject);
  244.     procedure linkNewContactClick(Sender: TObject);
  245.     procedure Refresh1Click(Sender: TObject);
  246.     procedure PopupMenu2Popup(Sender: TObject);
  247.     procedure Properties1Click(Sender: TObject);
  248.     procedure SplitterPaint(Sender: TObject);
  249.     procedure OpenCloseImageClick(Sender: TObject);
  250.     procedure linkShowSIMClick(Sender: TObject);
  251.   private
  252.     { Private declarations }
  253.   public
  254.     { Public declarations }
  255.     procedure GetIdent;
  256.     procedure UpdateWelcomePage(Init: boolean = False);
  257.   end;
  258.  
  259. implementation
  260.  
  261. uses uGlobal, Unit1, uMissedCalls, uCalling, uSyncPhonebook, uComposeSMS;
  262.  
  263. {$R *.dfm}
  264.  
  265. { TfrmInfoView }
  266.  
  267. procedure TfrmInfoView.GetIdent;
  268. begin
  269.   try
  270.     Form1.TxAndWait('AT+CGMI');
  271.     lbManufacturer.Caption := Form1.FRxBuffer[0];
  272.   except
  273.     lbManufacturer.Caption := '?';
  274.   end;
  275.  
  276.   try
  277.     Form1.TxAndWait('AT+CGMM');
  278.     lbModel.Caption := Form1.FRxBuffer[0];
  279.   except
  280.     lbModel.Caption := '?';
  281.   end;
  282.  
  283.   try
  284.     Form1.TxAndWait('AT+CGMR');
  285.     lbSWRevision.Caption := Form1.FRxBuffer[0];
  286.   except
  287.     lbSWRevision.Caption := '?';
  288.   end;
  289.  
  290.   try
  291.     Form1.TxAndWait('AT+CGSN');
  292.     lbSerialNumber.Caption := Form1.FRxBuffer[0];
  293.   except
  294.     lbSerialNumber.Caption := '?';
  295.   end;
  296. end;
  297.  
  298. procedure TfrmInfoView.UpdateWelcomePage(Init: boolean);
  299. var
  300.   i: integer;
  301.   s: string;
  302. begin
  303.   TodayCaptionPanel.Visible := Form1.FShowTodayCaption;
  304.   { Signal and Power }
  305.   if Form1.FConnectingComplete then begin
  306.     wSignal.Caption := IntToStr(Form1.pbRSSI.Position)+'%';
  307.     wBattery.Caption := IntToStr(Form1.pbPower.Position)+'%';
  308.     if Form1.FBatteryLow then
  309.       wBattery.Font.Color := clRed
  310.     else
  311.       wBattery.ParentFont := True;
  312.   end
  313.   else begin
  314.     wSignal.Caption := '?';
  315.     wBattery.Caption := '?';
  316.     wCharge.Caption := '?';
  317.   end;
  318.   if Form1.FOnACPower then wCharge.Caption := 'yes'
  319.     else wCharge.Caption := 'no';
  320.   { Inbox and Outbox }
  321.   i := Form1.GetNewMessagesCounter(Form1.FNodeMsgInbox) +
  322.     Form1.GetNewMessagesCounter(Form1.FNodeMsgArchive);
  323.   if i <> 0 then begin
  324.     wInboxNew.Caption := IntToStr(i);
  325.     wInboxNew.Font.Style := wInboxNew.Font.Style + [fsBold];
  326.     wInboxNew.Font.Color := clRed;
  327.     linkShowNewMessages.Enabled := True;
  328.   end
  329.   else begin
  330.     wInboxNew.Caption := 'none';
  331.     wInboxNew.ParentFont := True;
  332.     linkShowNewMessages.Enabled := False;
  333.   end;
  334.   i := Form1.GetNewMessagesCounter(Form1.FNodeMsgOutbox);
  335.   if i <> 0 then begin
  336.     wOutboxNew.Caption := IntToStr(i);
  337.     wOutboxNew.Font.Style := wInboxNew.Font.Style + [fsBold];
  338.     wOutboxNew.Font.Color := clRed;
  339.     linkSendMessages.Enabled := True;
  340.   end
  341.   else begin
  342.     wOutboxNew.Caption := 'none';
  343.     wOutboxNew.ParentFont := True;
  344.     linkSendMessages.Enabled := False;
  345.   end;
  346.   { Calls }
  347.   if Form1.ActionMissedCalls.Enabled and (frmMissedCalls <> nil) and (frmMissedCalls.RecentMissedCalls <> 0) then begin
  348.     i := frmMissedCalls.RecentMissedCalls;
  349.     wMissedCallsNum.Caption := IntToStr(i);
  350.     wMissedCallsNum.Font.Style := wMissedCallsNum.Font.Style + [fsBold];
  351.     wMissedCallsNum.Font.Color := clRed;
  352.   end
  353.   else begin
  354.     wMissedCallsNum.Caption := 'none';
  355.     wMissedCallsNum.ParentFont := True;
  356.   end;
  357.   { Address book }
  358.   wMENum.Caption := IntToStr(Form1.FNodeContactsME.Count);
  359.   { Initial update when Welcome page is shown }
  360.   if Form1.FShowDiagram and Form1.CanUseEBCA(True) then DiagramPanel.Height := Chart1.Height + 9
  361.     else DiagramPanel.Height := 0;
  362.   if Init then begin
  363.     linkJumpArchive.Left := linkJumpInbox.Left + linkJumpInbox.Width + 8;
  364.     linkGetMessages.Left := linkJumpArchive.Left + linkJumpArchive.Width + 8;
  365.     linkJumpOutbox.Left := linkComposeMessage.Left + linkComposeMessage.Width + 8;
  366.     linkShowPhonebook.Left := linkNewContact.Left + linkNewContact.Width + 8;
  367.     linkShowSIM.Left := linkShowPhonebook.Left + linkShowPhonebook.Width + 8;
  368.     { Date and Operator }
  369.     wDate.Caption := FormatDateTime(LongDateFormat,Date);
  370.     s := Form1.FSelOperator;
  371.     if s = '' then s := '?';
  372.     wOperator.Caption := s;
  373.     //if Form1.Visible and Visible then
  374.     try
  375.       { Calls }
  376.       lvCalls.Items.BeginUpdate;
  377.       try
  378.         lvCalls.Clear;
  379.         for i := 0 to Form1.FNodeCallsIn.Count-1 do
  380.           with lvCalls.Items.Add do begin
  381.             ImageIndex := Form1.FNodeCallsIn.Item[i].ImageIndex;
  382.             s := TStrings(Form1.FNodeCallsIn.Data)[Form1.FNodeCallsIn.Item[i].StateIndex-1];
  383.             Caption := GetToken(s,0);
  384.             SubItems.Add(GetToken(s,1));
  385.           end;
  386.         for i := 0 to Form1.FNodeCallsOut.Count-1 do
  387.           with lvCalls.Items.Add do begin
  388.             ImageIndex := Form1.FNodeCallsOut.Item[i].ImageIndex;
  389.             s := TStrings(Form1.FNodeCallsOut.Data)[Form1.FNodeCallsOut.Item[i].StateIndex-1];
  390.             Caption := GetToken(s,0);
  391.             SubItems.Add(GetToken(s,1));
  392.           end;
  393.         wRecentCallsNum.Caption := IntToStr(lvCalls.Items.Count);
  394.       finally
  395.         lvCalls.AlphaSort;
  396.         lvCalls.Items.EndUpdate;
  397.       end;
  398.       lvMissed.Items.BeginUpdate;
  399.       try
  400.         lvMissed.Clear;
  401.         for i := 0 to Form1.FNodeCallsMissed.Count-1 do
  402.           with lvMissed.Items.Add do begin
  403.             ImageIndex := Form1.FNodeCallsMissed.Item[i].ImageIndex;
  404.             s := TStrings(Form1.FNodeCallsMissed.Data)[Form1.FNodeCallsMissed.Item[i].StateIndex-1];
  405.             Caption := GetToken(s,0);
  406.             SubItems.Add(GetToken(s,1));
  407.           end;
  408.       finally
  409.         lvMissed.AlphaSort;
  410.         lvMissed.Items.EndUpdate;
  411.       end;
  412.     except
  413.     end;
  414.   end;
  415. end;
  416.  
  417. procedure TfrmInfoView.ListViewResize(Sender: TObject);
  418. begin
  419.   with Sender as TTntListView do begin
  420.     Items.BeginUpdate;
  421.     Columns[1].Width := 100;
  422.     Columns[0].Width := Width - Columns[1].Width - 24;
  423.     Columns[0].Width := Columns[0].Width - 1;
  424.     Items.EndUpdate;
  425.   end;
  426. end;
  427.  
  428. procedure TfrmInfoView.ListViewCompare(Sender: TObject; Item1,
  429.   Item2: TListItem; Data: Integer; var Compare: Integer);
  430. begin
  431.   { Show recent first }
  432.   Compare := CompareStr(Item2.SubItems[0],Item1.SubItems[0]);
  433. end;
  434.  
  435. procedure TfrmInfoView.spMissedClick(Sender: TObject);
  436. begin
  437.   Form1.ActionMissedCalls.Execute;
  438. end;
  439.  
  440. procedure TfrmInfoView.sbCheckInboxClick(Sender: TObject);
  441. begin
  442.   Form1.ActionSMSDownloadInbox.Execute;
  443. end;
  444.  
  445. procedure TfrmInfoView.FrameResize(Sender: TObject);
  446. begin
  447.   Panel1.Width := Width div 2;
  448. end;
  449.  
  450. procedure TfrmInfoView.linkGetMessagesClick(Sender: TObject);
  451. begin
  452.   Form1.ActionSMSDownloadInbox.Execute;
  453. end;
  454.  
  455. procedure TfrmInfoView.linkJumpMsgFolderClick(Sender: TObject);
  456. begin
  457.   if Sender = linkJumpOutbox then
  458.     Form1.Explorer.Selected := Form1.FNodeMsgOutbox
  459.   else
  460.   if Sender = linkJumpInbox then
  461.     Form1.Explorer.Selected := Form1.FNodeMsgInbox
  462.   else
  463.   if Sender = linkJumpArchive then
  464.     Form1.Explorer.Selected := Form1.FNodeMsgArchive
  465.   else
  466.   if Sender = linkShowNewMessages then
  467.     if Form1.GetNewMessagesCounter(Form1.FNodeMsgInbox) <> 0 then
  468.       Form1.Explorer.Selected := Form1.FNodeMsgInbox
  469.     else
  470.       Form1.Explorer.Selected := Form1.FNodeMsgArchive;
  471. end;
  472.  
  473. procedure TfrmInfoView.linkComposeMessageClick(Sender: TObject);
  474. begin
  475.   Form1.ActionSMSNewMsg.Execute;
  476. end;
  477.  
  478. procedure TfrmInfoView.linkSendMessagesClick(Sender: TObject);
  479. begin
  480.   Form1.ActionConnectionSendOutboxMsgs.Execute;
  481. end;
  482.  
  483. procedure TfrmInfoView.linkSyncPhonebookClick(Sender: TObject);
  484. begin
  485.   Form1.ActionSyncPhonebook.Execute;
  486. end;
  487.  
  488. procedure TfrmInfoView.linkShowPhonebookClick(Sender: TObject);
  489. begin
  490.   Form1.Explorer.Selected := Form1.FNodeContactsME;
  491. end;
  492.  
  493. procedure TfrmInfoView.linkNewContactClick(Sender: TObject);
  494. begin
  495.   if Form1.frmSyncPhonebook.DoEdit(True) then
  496.     UpdateWelcomePage;
  497. end;
  498.  
  499. procedure TfrmInfoView.Refresh1Click(Sender: TObject);
  500. begin
  501.   if Screen.ActiveControl = lvCalls then begin
  502.     Form1.InitCalls(Form1.fnodecallsIn);
  503.     UpdateWelcomePage(True);
  504.     Form1.InitCalls(Form1.fnodecallsOut);
  505.     UpdateWelcomePage(True);
  506.   end;
  507.   if Screen.ActiveControl = lvMissed then begin
  508.     Form1.InitCalls(Form1.fnodecallsMissed);
  509.     UpdateWelcomePage(True);
  510.   end;
  511. end;
  512.  
  513. procedure TfrmInfoView.PopupMenu2Popup(Sender: TObject);
  514. var
  515.   contact: PContactData;
  516. begin
  517.   Refresh1.Enabled := Form1.FConnected and not Form1.FObex.Connected;
  518.   Properties1.Enabled := Form1.IsContactNumberSelected and
  519.     (Form1.frmSyncPhonebook.FindContact(Form1.LookupContact(
  520.       Form1.ExtractNumber(Form1.LocateSelContactNumber)),contact));
  521. end;
  522.  
  523. procedure TfrmInfoView.Properties1Click(Sender: TObject);
  524. var
  525.   contact: PContactData;
  526. begin
  527.   if Form1.frmSyncPhonebook.FindContact(Form1.LookupContact(
  528.     Form1.ExtractNumber(Form1.LocateSelContactNumber)),contact) then
  529.     with Form1.frmSyncPhonebook do begin
  530.       SelContact := contact;
  531.       if DoEdit then UpdateWelcomePage(True);
  532.     end;
  533. end;
  534.  
  535. procedure TfrmInfoView.SplitterPaint(Sender: TObject);
  536. var
  537.   R: TRect;
  538.   i,j: integer;
  539. begin
  540.   with (Sender as TSplitter) do begin
  541.     R := ClientRect;
  542.     with Canvas do begin
  543.       Pen.Color := $00E0F0E0;
  544.       Pen.Style := psDot;
  545.       Brush.Color := Color;
  546.       Brush.Style := bsSolid;
  547.       FillRect(R);
  548.       i := Abs(R.Right - R.Left);
  549.       j := Abs(R.Bottom - R.Top);
  550.       if i < j then begin // vertical
  551.         R.Top := R.Top + j div 2 - 31;
  552.         R.Bottom := R.Bottom - j div 2 + 31;
  553.         i := R.Left + i div 2;
  554.         MoveTo(i-1,R.Top);
  555.         LineTo(i-1,R.Bottom);
  556.         MoveTo(i+1,R.Top);
  557.         LineTo(i+1,R.Bottom);
  558.         Pen.Color := $00A0C0A0;
  559.         MoveTo(i,R.Top);
  560.         LineTo(i,R.Bottom);
  561.       end
  562.       else begin // horizontal
  563.         R.Left := R.Left + i div 2 - 31;
  564.         R.Right := R.Right - i div 2 + 31;
  565.         j := R.Top + j div 2;
  566.         MoveTo(R.Left, j-1);
  567.         LineTo(R.Right,j-1);
  568.         MoveTo(R.Left, j+1);
  569.         LineTo(R.Right,j+1);
  570.         Pen.Color := $00A0C0A0;
  571.         MoveTo(R.Left, j);
  572.         LineTo(R.Right,j);
  573.       end;
  574.     end;
  575.   end;
  576. end;
  577.  
  578. procedure TfrmInfoView.OpenCloseImageClick(Sender: TObject);
  579. var
  580.   panel: TPanel;
  581. begin
  582.   panel := ((Sender as TControl).Parent as TPanel);
  583.   if panel.Height < 40 then begin // open it
  584.     (Sender as TImage).Tag := 0;
  585.     ImageList1.GetBitmap(0,(Sender as TImage).Picture.Bitmap);
  586.     { Resize }
  587.     if Sender = Image13 then begin
  588.       PhoneAddressPanel.Align := alBottom;
  589.       PhoneAddressPanel.Height := PhoneAddressPanel.Height - panel.Tag;
  590.       Splitter5.Align := alBottom;
  591.       panel.Align := alClient;
  592.     end;
  593.     if Sender = Image12 then begin
  594.       BatteryPanel.Align := alBottom;
  595.       BatteryPanel.Height := BatteryPanel.Height - panel.Tag;
  596.       Splitter3.Align := alBottom;
  597.       panel.Align := alClient;
  598.     end;
  599.     panel.Constraints.MaxHeight := 0;
  600.     panel.Constraints.MinHeight := panel.Tag;
  601.     { update view }
  602.     if Sender = Image15 then
  603.       BigImage.Visible := True;
  604.     if Sender = Image10 then begin
  605.       Splitter2.Visible := True;
  606.       Splitter2.Top := InboxPanel.Top + InboxPanel.Height;
  607.     end;
  608.     if Sender = Image11 then begin
  609.       Splitter4.Visible := True;
  610.       Splitter4.Top := OuboxPanel.Top + OuboxPanel.Height;
  611.     end;
  612.     if (Sender = Image14) or (Sender = Image12) then
  613.       if (Image14.Tag = 0) and (Image12.Tag = 0) then begin
  614.         Splitter3.Visible := True;
  615.         Splitter3.Top := BatteryPanel.Top-1;
  616.       end;
  617.     if (Sender = Image15) or (Sender = Image13) then
  618.       if (Image15.Tag = 0) and (Image13.Tag = 0) then begin
  619.         Splitter5.Visible := True;
  620.         Splitter5.Top := PhoneAddressPanel.Top-1;
  621.       end;
  622.   end
  623.   else begin // close it
  624.     (Sender as TImage).Tag := 1;
  625.     ImageList1.GetBitmap(1,(Sender as TImage).Picture.Bitmap);
  626.     { Resize }
  627.     panel.Tag := panel.Constraints.MinHeight;
  628.     panel.Constraints.MinHeight := 39;
  629.     panel.Constraints.MaxHeight := 39;
  630.     if Sender = Image13 then begin
  631.       panel.Align := alTop;
  632.       Splitter5.Align := alTop;
  633.       PhoneAddressPanel.Align := alClient;
  634.     end;
  635.     if Sender = Image12 then begin
  636.       panel.Align := alTop;
  637.       Splitter3.Align := alTop;
  638.       BatteryPanel.Align := alClient;
  639.     end;
  640.     { update view }
  641.     if Sender = Image15 then
  642.       BigImage.Visible := False;
  643.     if Sender = Image10 then
  644.       Splitter2.Visible := False;
  645.     if Sender = Image11 then
  646.       Splitter4.Visible := False;
  647.     if (Sender = Image14) or (Sender = Image12) then
  648.       Splitter3.Visible := False;
  649.     if (Sender = Image15) or (Sender = Image13) then
  650.       Splitter5.Visible := False;
  651.   end;
  652. end;
  653.  
  654. procedure TfrmInfoView.linkShowSIMClick(Sender: TObject);
  655. begin
  656.   Form1.Explorer.Selected := Form1.FNodeContactsSM;
  657. end;
  658.  
  659. end.
  660.